package org.example;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelGroupingOne {

    public static void main(String[] args) {
        System.out.println("-->正在修改excel");
        String inputFilePath = "C:\\\\Users\\\\luke\\\\Desktop\\\\2.1.xlsx"; // 输入文件路径
        String outputFilePath = "C:\\\\Users\\\\luke\\\\Desktop\\\\2.2.xlsx"; // 输出文件路径

        try (FileInputStream fis = new FileInputStream(inputFilePath);
             Workbook workbook = new XSSFWorkbook(fis);
             FileOutputStream fos = new FileOutputStream(outputFilePath)) {

            System.out.println("-->获取工作表的第一个表格");
            Sheet sheet = workbook.getSheetAt(0);// 获取工作表的第一个表格
            System.out.println("-->获取最后一行的行号");
            int lastRowNum = sheet.getLastRowNum(); // 获取最后一行的行号
            System.out.println("-->获取当前处理行的上一行");
            Row lastRow = null; // 当前处理行的上一行
            System.out.println("-->获取分组的起始行号");
            int groupStartRow = 0; // 分组的起始行号

            // 遍历行，从第二行开始（跳过标题行）
            System.out.println("-->遍历行，从第二行开始（跳过标题行）");
            for (int i = 1; i <= lastRowNum; i++) {
                System.out.println("-->获取当前行");
                Row currentRow = sheet.getRow(i); // 获取当前行
                System.out.println("-->获取上一行");
                Row prevRow = sheet.getRow(i - 1); // 获取上一行

                // 判断当前行是否属于同一分组
                System.out.println("-->判断当前行是否属于同一分组");
                if (isInSameGroup(prevRow, currentRow)) {
                    if (lastRow == null) {
                        System.out.println("-->设置分组起始行号");
                        groupStartRow = i - 1; // 设置分组起始行号
                    }
                    System.out.println("-->更新当前处理行的上一行");
                    lastRow = currentRow; // 更新当前处理行的上一行
                } else {
                    // 不属于同一分组时，处理上一分组数据
                    System.out.println("-->不属于同一分组时，处理上一分组数据");
                    if (lastRow != null) {
                        System.out.println("-->创建分组并合并单元格");
                        createGroup(sheet, groupStartRow, i - 1, lastRow); // 创建分组并合并单元格
                        System.out.println("-->重置当前处理行的上一行");
                        lastRow = null; // 重置当前处理行的上一行
                    }
                }
            }
            System.out.println("-->处理最后一个分组");
            // 处理最后一个分组（如果存在）
            if (lastRow != null) {
                createGroup(sheet, groupStartRow, lastRowNum, lastRow);
            }
            System.out.println("-->将修改后的工作簿写入输出文件");
            // 将修改后的工作簿写入输出文件
            workbook.write(fos);
            System.out.println("-->已成功修改excel");

        } catch (IOException e) {
            e.printStackTrace();
        }

        String inputFile = "C:\\\\Users\\\\luke\\\\Desktop\\\\2.2.xlsx"; // 输入Excel文件名
        String outputFile = "C:\\\\Users\\\\luke\\\\Desktop\\\\2.3.xlsx"; // 输出Excel文件名
        ExcelUtility.removeBlankRows(inputFile, outputFile);

    }

    // 判断两行是否属于同一分组的方法
    private static boolean isInSameGroup(Row prevRow, Row currentRow) {
        if (prevRow == null || currentRow == null) {
            return false;
        }
        System.out.println("-->添加自定义规则，默认比较第四列（D列）的值");
        // 添加自定义规则，默认比较第四列（D列）的值
        Cell prevCell = prevRow.getCell(3);
        Cell currentCell = currentRow.getCell(3);
        if (prevCell == null || currentCell == null) {
            return false;
        }

        String prevContent = getCellContent(prevCell);
        String currentContent = getCellContent(currentCell);

        try {
            int prevValue = Integer.parseInt(prevContent);
            int currentValue = Integer.parseInt(currentContent);
            if (currentValue == prevValue + 1) {
                System.out.println("-->比较两行的列E至K（第五列至第十一列）的值是否相同");
                // 比较两行的列E至K（第五列至第十一列）的值是否相同
                for (int i = 4; i <= 10; i++) {
                    Cell prevContentCell = prevRow.getCell(i);
                    Cell currentContentCell = currentRow.getCell(i);
                    if (!getCellContent(prevContentCell).equals(getCellContent(currentContentCell))) {
                        return false;
                    }
                }
                return true;
            }
        } catch (NumberFormatException e) {
            System.out.println("-->处理第四列（D列）中的非数值情况");
        }

        return false;
    }

    // 获取单元格内容的方法
    private static String getCellContent(Cell cell) {
        if (cell == null) {
            return "";
        }

        String content;
        switch (cell.getCellType()) {
            case STRING -> content = cell.getStringCellValue().trim();
            case NUMERIC -> {
                if (DateUtil.isCellDateFormatted(cell)) {
                    content = cell.getDateCellValue().toString();
                } else {
                    content = String.valueOf((int) cell.getNumericCellValue());
                }
            }
            default -> content = "";
        }
        return content;
    }

    // 创建分组并合并单元格的方法
    private static void createGroup(Sheet sheet, int startRow, int endRow, Row lastRow) {
        System.out.println("-->修改最后一行的第i列内容以指示合并计数");
        //修改最后一行的第i列内容以指示合并计数
        int mergeCount = endRow - startRow + 1;
        Cell lastA = lastRow.getCell(8);
        lastA.setCellValue(mergeCount);

        System.out.println("-->修改最后一行的第四列（D列）内容，合并分组范围的第四列的值");
        // 修改最后一行的第四列（D列）内容，合并分组范围的第四列的值
        Cell lastCell = lastRow.getCell(3);
        Cell firstCell = sheet.getRow(startRow).getCell(3);
        String combinedValue = firstCell.getStringCellValue() + "-" + lastCell.getStringCellValue();
        lastCell.setCellValue(combinedValue);

        // 删除组范围内除最后一行以外的行
        for (int i = endRow - 1; i >= startRow; i--) {
            System.out.println("-->删除组范围内除最后一行以外的行");
            sheet.removeRow(sheet.getRow(i));
        }
    }


}
